package com.atguigu.gmall.order.pay.config;


import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.atguigu.gmall.common.util.JsonUtils;
import com.atguigu.gmall.model.order.OrderInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;


/**
 * 支付有关的功能都在这里封装
 */
@Slf4j
@Component
public class PayTemplate {

    @Autowired
    private AlipayClient alipayClient;

    @Autowired
    PayProperties properties;


    /**
     * 得到支付页
     * @return
     */
    public String getPayPage(OrderInfo orderInfo){
        //1、创建一个支付请求，
        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();

        //2、设置好支付成功以后跳转到哪个页面
        alipayRequest.setReturnUrl(properties.getReturn_url());
        alipayRequest.setNotifyUrl(properties.getNotify_url());

        //商户订单号 ： 2022325103340288
        //订单名称 ： 测试
        //付款金额 ： 111
        //商品描述：
        //3、准备支付数据
        Map<String,String> map = new HashMap<>();
        map.put("out_trade_no",orderInfo.getOutTradeNo() );
        map.put("total_amount",orderInfo.getTotalAmount().toString());
        map.put("subject","尚品汇订单");
        map.put("body",orderInfo.getTradeBody());
        map.put("product_code","FAST_INSTANT_TRADE_PAY");
        Date time = orderInfo.getExpireTime(); //yyyy-MM-dd HH:mm:ss
        String format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(time);
        map.put("time_expire",format); //指定这个单的绝对过期时间
        String jsonStr = JsonUtils.parseObjectToJsonStr(map);

        //能传递的所有参数 https://opendocs.alipay.com/open/028r8t?scene=22#%E8%AF%B7%E6%B1%82%E5%8F%82%E6%95%B0_2
        //4、把当前支付信息设置到支付请求中
        alipayRequest.setBizContent(jsonStr);




        //5、执行支付请求，得到响应
        String result = null;
        try {
            result = alipayClient.pageExecute(alipayRequest).getBody();
        } catch (AlipayApiException e) {
            log.error("支付系统异常支付订单{}，原因：{}，",orderInfo.getId(),e);
        }

        //6、返回支付自动跳转页
        return result;
    }


    /**
     * 验证签名
     * @param params
     * @return
     * @throws AlipayApiException
     */
    public boolean checkSgin(Map<String,String> params) throws AlipayApiException {
        boolean signVerified = AlipaySignature
                .rsaCheckV1(params,
                        properties.getAlipay_public_key(),
                        properties.getCharset(),
                        properties.getSign_type()); //调用SDK验证签名

        return signVerified; //验证的结果
    }



}
